/*
 * Stack.c
 *
 *  Created on: Dec 5, 2011
 *  	Author: sanglei
 * description: 通用栈的数组实现！支持任意类型
 */

#include "../headers/stack_array.h"
#include <assert.h>

int init_stack_array(Stack_Array * const pstk,const unsigned int byte_len){
	assert(pstk!=NULL);
	assert(byte_len>0);

	pstk->byte_len = byte_len;

	//此时栈中没有元素，栈top指针指向数组元素的0位置
	pstk->top = pstk->parray = malloc(DEFAULT_STACK_SIZE*byte_len);

	return 1;
}

int push_stack_array(Stack_Array *pstk,void *pvalue){
	assert(pstk!=NULL);
	assert(pvalue!=NULL);
	if(get_stack_size(pstk)>DEFAULT_STACK_SIZE){
		return 0;
	}else{
		memcpy(pstk->top,pvalue,pstk->byte_len);
		pstk->top+=pstk->byte_len;//top指针向上移动byte_len个字节
		return 1;
	}
}

int pop_stack_array(Stack_Array*pstk,void *prest){
	assert(pstk!=NULL);
	assert(prest!=NULL);
	if(!is_empty_array(pstk)){
		pstk->top -= pstk->byte_len;//栈顶指针下移一个元素位置，也就是下移byte_len个字节
		memcpy(prest,pstk->top,pstk->byte_len);
		return 1;

	}else{
		return 0;//栈中没有元素
	}
}

int drop_stack_array(Stack_Array *pstk){
	free(pstk->parray);
	pstk->top = pstk->parray = NULL;
	return 1;
}

int is_empty_array(const Stack_Array*const pstk){
	if(pstk->parray - pstk->top == 0){
		return 1;
	}else{
		return 0;
	}
}

int get_stack_size(const Stack_Array * const pstk){
	return pstk->top - pstk->parray;
}

int main_stack_array(){
	Stack_Array stk_array;
	int x=12,y;
	int *p = &x;
	init_stack_array(&stk_array,sizeof(p));
	push_stack_array(&stk_array,&x);
	pop_stack_array(&stk_array,&y);
	printf("stack array pop:%d\n",y);
	return 1;
}


//stackType content[StackSize];
//int top = -1;
//
//static void push(stackType e){
//	if(top > StackSize-2){
//		printf("stack over flowed !\n");
//		return;
//	}
//	content[++top] = e;
//}
//
//static stackType pop(){
//	if(top == -1){
//		printf("no elements in stack!\n");
//		return (stackType)NULL;
//	}
//	return content[top--];
//}
//
//static int isEmpty(){
//	return top == -1?1:0;
//}
//
//int size(){
//	return top+1;
//}
//
//void empty(){
//	top = -1;
//}
